/*
 * TDS PEC 4
 * Grupo 3H2M

 * Luis Rodríguez-Manzaneque Sánchez
 *
 * El paquete <code>edu.uoc.tds.pec4.aulas</code> contiene todos los módulos 
 * relativos al subsistema Aulas, tanto la parte de la interfaz gráfica de la 
 * aplicación cliente, como el interfaz e implementación del objeto remoto que
 * provee de servicios a la GUI.
 */
package edu.uoc.tds.pec4.aulas;

import edu.uoc.tds.pec4.rmi.GestorAulasInterface;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.LocalizacionDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.ReservaDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.common.components.TDSCheckbox;
import edu.uoc.tds.pec4.common.components.TablaUI;
import edu.uoc.tds.pec4.common.util.Cabecera;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.common.validation.ValidarGUI;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorAulasException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorDiccionarioException;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.lang.String;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * La clase <code>JIFListadoReservas</code> representa la interfaz de usuario 
 * para la consulta de aulas.<br />
 *
 * Interficie de usuario para la consulta de reservas.
 *
 * @author	3H2M
 * @version	08/12/2011
 * @see		edu.uoc.tds.pec4.common.GestorAulasInterface
 */
public class JIFListadoReservas extends javax.swing.JInternalFrame {

    //====================================================== campos
    //... componentes gráficos
    private JScrollPane jScrollPane = null;
    //Contendra la consulta obtenida, en formato grid
    private TablaUI TablaConsulta = null;
    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto Es el objeto empleado como interfaz en la comunicación RMI */
    private GestorDiccionarioInterface objRemotoDic = null;
    private GestorAulasInterface objRemotoAula = null;

    /** usLogeado representa al usuario que está autentificado */
    private UsuarioDTO usLogeado;
    
    /**
     * Constructor de la clase.<br />
     * Crea el JInternalFrame del listado de solicitudes
     *
     * @param   pObjRemoto El objeto remoto obtenido a través de la conexión RMI e
     *          implementa la interfaz que sirve las funcionalidades de acceso al
     *          servidor.
     * @throws  RemoteException En caso de producirse un problema con la conexión RMI
     */
    public JIFListadoReservas(UsuarioDTO usLogeado) {
        super(TDSLanguageUtils.getMessage("aulas.consulta.reservas.titulo"), false, true, false);
        
        this.usLogeado=usLogeado;        

        conectarCliente();
        initComponents();

        inicializarComponentes();

        //Situamos la ventana en la pantalla
        this.setLocation(1 , 1);  
    }

    /**
     * Inicializa y situa los componentes de la GUI
     */
    private void inicializarComponentes() {
        
        // Colocamos los checkbox de los estados
        PanelEstado.setLayout(new GridLayout(2, 2));

        for (int i = 0; i < Constantes.RESERVA_ESTADOS.length; i++) {

            TDSCheckbox cb = new TDSCheckbox();
            cb.setText(TDSLanguageUtils.getMessage("aulas.consulta.reservas.estado." + Constantes.RESERVA_ESTADOS[i]));
            cb.setValor(Constantes.RESERVA_ESTADOS[i]);
            PanelEstado.add(cb);
        }

        PanelListado.add(getJScrollPane(), null);
    }
    
    /**
     * Conectar con el servidor RMI de paises
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoDic = (GestorDiccionarioInterface) Naming.lookup("GestorDiccionario");
            objRemotoAula = (GestorAulasInterface) Naming.lookup("GestorAulas");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el desplegable de paises
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboPais() {
        if (comboPais == null) {
            try {
                List<PaisDTO> paises = objRemotoDic.listaPaises();
                paises.add(0, new PaisDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.pais.todos.opciondefecto")));
                comboPais = new JComboBox(paises.toArray());
                comboPais.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboPaisActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboPais;
    }

    /**
     * Este método inicializa el desplegable de provincias
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboProvincia() {
        if (comboProvincia == null) {
            try {
                int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();
                List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
                provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
                comboProvincia = new JComboBox(provincias.toArray());
                comboProvincia.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboProvinciaActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboProvincia;
    }

    /**
     * Este método inicializa el desplegable de ciudades
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboCiudad() {
        if (comboCiudad == null) {
            try {
                int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();
                List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
                ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
                comboCiudad = new JComboBox(ciudades.toArray());
                comboCiudad.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        //comboCiudadActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboCiudad;
    }

    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * paises.<br />
     * Provoca el refresco de provincias en el desplegable de provincias, mostrando
     * sólo aquellas que corresponden con el país indicado por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboPaisActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Recuperamos el pais seleccionado
            int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();

            List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
            comboProvincia.removeAllItems();
            provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
            for (ProvinciaDTO inc : provincias) {
                comboProvincia.addItem(inc);
            }

            // Cargamos el combo de ciudades
            comboProvinciaActionPerformed(null);

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    ex.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * provincias.<br />
     * Provoca el refresco de ciudades en el desplegable de ciudades, mostrando
     * sólo aquellas que corresponden con la provincia indicada por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboProvinciaActionPerformed(java.awt.event.ActionEvent evt) {

        if (comboProvincia.getSelectedItem() == null) {
            return;
        }

        try {
            // Recuperamos la provincia seleccionada
            int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();
            List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
            comboCiudad.removeAllItems();
            ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
            for (CiudadDTO inc : ciudades) {
                comboCiudad.addItem(inc);
            }

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el botón Buscar
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdBuscar() {
        if (cmdBuscar == null) {
            cmdBuscar = new JButton();
            cmdBuscar.setText(TDSLanguageUtils.getMessage("aulas.consulta.reservas.boton.buscar"));
            cmdBuscar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdBuscarActionPerformed(e);
                }
            });
        }
        return cmdBuscar;
    }

    /**
     * Método que maneja el evento sobre el botón de Buscar.<br />
     * Realiza la operación de búsqueda de solicitudes.
     */
    private void cmdBuscarActionPerformed(ActionEvent e) {
        
        //Vaciamos la tabla
        TablaConsulta.setFilas(getFilasTabla(new ArrayList<ReservaDTO>()));
        TablaConsulta.refrescarFilas();

        //Recuperamos los datos para el filtro
        //pais,provincia,ciudad,listTiposSolicitudes,listEstados
        PaisDTO pais = (PaisDTO) comboPais.getSelectedItem();
        ProvinciaDTO provincia = (ProvinciaDTO) comboProvincia.getSelectedItem();
        CiudadDTO ciudad = (CiudadDTO) comboCiudad.getSelectedItem();
        LocalizacionDTO loc = new LocalizacionDTO(ciudad, provincia, pais);

        
        // Recuperamos qué Estados se ha seleccionado
        List<Integer> estados = new ArrayList<Integer>();
        for (int i = 0; i < PanelEstado.getComponentCount(); i++) {
            if (PanelEstado.getComponent(i) instanceof TDSCheckbox) {
                TDSCheckbox check = (TDSCheckbox) PanelEstado.getComponent(i);
                if (check.isSelected()) {
                    estados.add(check.getValor());
                }
            }
        }
        // Recuperamos la Fecha
        
        try {
            // Llamamos al objeto remoto
            String fechaDesde=txtDeFecha.getText();
            String fechaHasta=txtAFecha.getText();

            List<ReservaDTO> res = objRemotoAula.listaReservas(loc, estados, fechaDesde, fechaHasta);
            if (!res.isEmpty()) {
                // Recargo las filas en la tabla
                TablaConsulta.setFilas(getFilasTabla(res));
                TablaConsulta.refrescarFilas();                
            } else {
                // Avisamos que no se han encontrado datos
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("aulas.consulta.reservas.nohaydatos"), 
                        TDSLanguageUtils.getMessage("aulas.consulta.reservas.titulo"),
                        JOptionPane.INFORMATION_MESSAGE);
            }

        } catch (GestorAulasException giE) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.gestor.desc") + Constantes.SL +
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.gestor"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.gestor.desc") + Constantes.SL +
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.remoto.desc"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el botón Cerrar
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdCerrar() {
        if (cmdCerrar == null) {
            cmdCerrar = new JButton();
            cmdCerrar.setText(TDSLanguageUtils.getMessage("aulas.consulta.reserva.boton.cerrar"));
            cmdCerrar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdCerrarActionPerformed(e);
                }
            });
        }
        return cmdCerrar;
    }

    /**
     * Método que maneja el evento sobre el botón de Cerrar.<br />
     * Realiza la operación de cierre del frame
     */
    private void cmdCerrarActionPerformed(ActionEvent e) {
        setVisible(false);
    }

    /**
     * Este método inicializa jScrollPane
     *
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 20, 670, 230));
            jScrollPane.setViewportView(getTablaConsulta());
        }
        return jScrollPane;
    }

    /**
     * This method initializes TablaConsulta
     *
     * @return javax.swing.JTable
     */
    private JTable getTablaConsulta() {
        if (TablaConsulta == null) {
            TablaConsulta = new TablaUI(getCabecerasTabla(), getFilasTabla(new ArrayList<ReservaDTO>()));
            TablaConsulta.setLocation(new Point(0, 0));

            TablaConsulta.addMouseListener(new MouseAdapter()
               {
                  public void mouseClicked(MouseEvent e)
                  {
                     int fila = TablaConsulta.rowAtPoint(e.getPoint());
                     //int columna = TablaConsulta.columnAtPoint(e.getPoint());
                     //if ((fila > -1) && (columna > -1))
                     if (fila > -1) {
                         if (ValidarGUI.isInteger(TablaConsulta.getModel().getValueAt(fila,1).toString())) {
                            int idReserva = Integer.parseInt(TablaConsulta.getModel().getValueAt(fila,1).toString());
                            editarReserva(idReserva);
                         }
                      }
                  }
               });

           
            TablaConsulta.getTableHeader().addMouseListener(new MouseAdapter() {
                
                  public void mouseClicked(MouseEvent mouseEvent) {
                    int index = TablaConsulta.convertColumnIndexToModel(TablaConsulta.columnAtPoint(mouseEvent.getPoint()));
                    if (index >= 0) {
                      System.out.println("Click en columna " + index + " " + TablaConsulta.getModel().getColumnName(index));
                    }
                  };
                });            
        }
        return TablaConsulta;
    }

    /**
     * Genera las cabeceras de las columnas tabla. El mapa de cabeceras es una
     * estructura de tipo diccionario que implementa pares clave-valor, siendo la
     * clave la posición de la columna y el valor la columna, en concreto un objeto
     * de tipo Cabecera que a su vez lleva el nombre de la columna y su ancho
     *
     * @return  Un objeto <code>Map<Cabecera, Integer></code> que mantiene un
     *          diccionario con todas las columnas de la tabla, su posición y
     *          tamaño.
     */
    private List<Cabecera> getCabecerasTabla() {
        // La Cabecera indica el nombre de columna y tamaño
        List<Cabecera> vCabecera = new ArrayList<Cabecera>();
        
        // Recordar: Cabecera (titulo, anchoColumna)
   
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.estado"),50));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.identificador"),40));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.fechadesde"),60));
         vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.fechahasta"),60));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.cliente"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.aula"),90));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.solicitud"),50));
        vCabecera.add(new
                Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.reservas.panel.importe"),60));
        return vCabecera;
    }

    /**
     * A partir de una lista de objetos, devuelve listas de listas de objetos para
     * que se puedan mostrar en una tabla
     *
     * @return javax.swing.JTable
     */
    private List<List> getFilasTabla(List<ReservaDTO> vCv) {
        List<List> reservas = new ArrayList<List>();

        try {
            
            List<String> vEstado = new ArrayList<String>();
            List<Integer> vIdentificador = new ArrayList<Integer>();
            List<Date> vFdesdeReserva = new ArrayList<Date>();
            List<Date> vFhastaReserva = new ArrayList<Date>();
            List<String> vCliente = new ArrayList<String>();
            List<Integer> vAula = new ArrayList<Integer>();
            List<Integer> vSolicitud = new ArrayList<Integer>();
            List<Double> vImporte = new ArrayList<Double>();
            for (ReservaDTO cv : vCv) {
                vEstado.add(TDSLanguageUtils.getMessage("aulas.consulta.reservas.estado." + cv.getEstado()));
                vIdentificador.add(cv.getIdReserva());
               // vFdesdeReserva.add(UtilidadesGUI.obtenerFecha(cv.getFechaDesde()));
                vFdesdeReserva.add(cv.getFechaDesde());
                vFhastaReserva.add(cv.getFechaHasta());
                vCliente.add(cv.getNomCliente());
                vAula.add(cv.getIdAula());
                vSolicitud.add(cv.getNumSolicitud());
                vImporte.add(cv.getImporte());
            }
            reservas.add(vEstado);
            reservas.add(vIdentificador);
            reservas.add(vFdesdeReserva);
            reservas.add(vFhastaReserva);
            reservas.add(vCliente);
            reservas.add(vAula);
            reservas.add(vSolicitud);
            reservas.add(vImporte);
                        
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                TDSLanguageUtils.getMessage("aulas.consulta.reservas.err.filas") + Constantes.SL +
                e.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.reservas.error"),
                JOptionPane.ERROR_MESSAGE);
        }

        return reservas;
    }

    private void editarReserva(int idReserva) {
        Frame frame = JOptionPane.getFrameForComponent(this);
        DialogDetalleReserva dlDetalleReserva = new DialogDetalleReserva(frame, true,
                objRemotoDic, objRemotoAula, idReserva, usLogeado);

        dlDetalleReserva.setVisible(true);

        System.out.println(idReserva);
    }
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        PanelFiltro = new javax.swing.JPanel();
        PanelLocalizacion = new javax.swing.JPanel();
        labelPais = new javax.swing.JLabel();
        comboPais = getComboPais();
        labelProvincia = new javax.swing.JLabel();
        comboProvincia = getComboProvincia();
        labelCiudad = new javax.swing.JLabel();
        comboCiudad = getComboCiudad();
        PanelEstado = new javax.swing.JPanel();
        cmdBuscar = getCmdBuscar();
        jPanelFecha = new javax.swing.JPanel();
        jLabelDeFecha = new javax.swing.JLabel();
        jLabelAFecha = new javax.swing.JLabel();
        txtDeFecha = new javax.swing.JTextField();
        txtAFecha = new javax.swing.JTextField();
        jPanelDuracion = new javax.swing.JPanel();
        jLabelDeHora = new javax.swing.JLabel();
        jLabelAHora = new javax.swing.JLabel();
        jTextFieldDeHora = new javax.swing.JTextField();
        jTextFieldAHora = new javax.swing.JTextField();
        jCheckBoxDiaCompleto = new javax.swing.JCheckBox();
        PanelListado = new javax.swing.JPanel();
        cmdCerrar = getCmdCerrar();

        PanelFiltro.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.filtro"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelFiltro.setName(""); // NOI18N

        PanelLocalizacion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Localización", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelLocalizacion.setName(""); // NOI18N

        labelPais.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelPais.setText("País");

        labelProvincia.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelProvincia.setText("Provincia");

        labelCiudad.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelCiudad.setText("Ciudad");

        javax.swing.GroupLayout PanelLocalizacionLayout = new javax.swing.GroupLayout(PanelLocalizacion);
        PanelLocalizacion.setLayout(PanelLocalizacionLayout);
        PanelLocalizacionLayout.setHorizontalGroup(
            PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelLocalizacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelProvincia)
                    .addComponent(labelPais)
                    .addComponent(labelCiudad))
                .addGap(18, 18, 18)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(comboCiudad, 0, 174, Short.MAX_VALUE)
                    .addComponent(comboPais, 0, 174, Short.MAX_VALUE)
                    .addComponent(comboProvincia, 0, 174, Short.MAX_VALUE))
                .addContainerGap())
        );
        PanelLocalizacionLayout.setVerticalGroup(
            PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelLocalizacionLayout.createSequentialGroup()
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelPais)
                    .addComponent(comboPais, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelProvincia)
                    .addComponent(comboProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelCiudad)
                    .addComponent(comboCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        PanelEstado.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Estado", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelEstado.setName(""); // NOI18N

        javax.swing.GroupLayout PanelEstadoLayout = new javax.swing.GroupLayout(PanelEstado);
        PanelEstado.setLayout(PanelEstadoLayout);
        PanelEstadoLayout.setHorizontalGroup(
            PanelEstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 135, Short.MAX_VALUE)
        );
        PanelEstadoLayout.setVerticalGroup(
            PanelEstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 78, Short.MAX_VALUE)
        );

        cmdBuscar.setText("Buscar");

        jPanelFecha.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Fecha", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        jPanelFecha.setName(""); // NOI18N

        jLabelDeFecha.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabelDeFecha.setText("De:");

        jLabelAFecha.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabelAFecha.setText("A:");

        txtDeFecha.setEditable(true);
        txtDeFecha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDeFechaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelFechaLayout = new javax.swing.GroupLayout(jPanelFecha);
        jPanelFecha.setLayout(jPanelFechaLayout);
        jPanelFechaLayout.setHorizontalGroup(
            jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelFechaLayout.createSequentialGroup()
                .addGroup(jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelAFecha)
                    .addComponent(jLabelDeFecha))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(txtDeFecha, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
                    .addComponent(txtAFecha, javax.swing.GroupLayout.Alignment.TRAILING)))
        );
        jPanelFechaLayout.setVerticalGroup(
            jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelFechaLayout.createSequentialGroup()
                .addGroup(jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelDeFecha)
                    .addComponent(txtDeFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelFechaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelAFecha)
                    .addComponent(txtAFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(32, Short.MAX_VALUE))
        );

        jPanelDuracion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Hora", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        jPanelDuracion.setName(""); // NOI18N

        jLabelDeHora.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabelDeHora.setText("De:");

        jLabelAHora.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabelAHora.setText("A:");

        jTextFieldDeHora.setEditable(true);
        jTextFieldDeHora.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextFieldDeHoraActionPerformed(evt);
            }
        });

        jCheckBoxDiaCompleto.setText("Día Completo");
        jCheckBoxDiaCompleto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxDiaCompletoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelDuracionLayout = new javax.swing.GroupLayout(jPanelDuracion);
        jPanelDuracion.setLayout(jPanelDuracionLayout);
        jPanelDuracionLayout.setHorizontalGroup(
            jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelDuracionLayout.createSequentialGroup()
                .addGroup(jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanelDuracionLayout.createSequentialGroup()
                            .addComponent(jLabelDeHora)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jTextFieldDeHora))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanelDuracionLayout.createSequentialGroup()
                            .addComponent(jLabelAHora)
                            .addGap(18, 18, 18)
                            .addComponent(jTextFieldAHora, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanelDuracionLayout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jCheckBoxDiaCompleto)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelDuracionLayout.setVerticalGroup(
            jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelDuracionLayout.createSequentialGroup()
                .addGroup(jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelDeHora)
                    .addComponent(jTextFieldDeHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelDuracionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelAHora)
                    .addComponent(jTextFieldAHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
                .addComponent(jCheckBoxDiaCompleto))
        );

        javax.swing.GroupLayout PanelFiltroLayout = new javax.swing.GroupLayout(PanelFiltro);
        PanelFiltro.setLayout(PanelFiltroLayout);
        PanelFiltroLayout.setHorizontalGroup(
            PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelFiltroLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PanelLocalizacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(PanelEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(PanelFiltroLayout.createSequentialGroup()
                        .addComponent(jPanelFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(6, 6, 6)
                        .addComponent(jPanelDuracion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, PanelFiltroLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 216, Short.MAX_VALUE)
                        .addComponent(cmdBuscar)
                        .addGap(33, 33, 33))))
        );
        PanelFiltroLayout.setVerticalGroup(
            PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelFiltroLayout.createSequentialGroup()
                .addGroup(PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(PanelLocalizacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(PanelFiltroLayout.createSequentialGroup()
                        .addGroup(PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(PanelEstado, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jPanelFecha, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jPanelDuracion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(18, 18, 18)
                        .addComponent(cmdBuscar)))
                .addGap(28, 28, 28))
        );

        PanelListado.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Relación de reservas", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelListado.setName(""); // NOI18N

        javax.swing.GroupLayout PanelListadoLayout = new javax.swing.GroupLayout(PanelListado);
        PanelListado.setLayout(PanelListadoLayout);
        PanelListadoLayout.setHorizontalGroup(
            PanelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 771, Short.MAX_VALUE)
        );
        PanelListadoLayout.setVerticalGroup(
            PanelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 222, Short.MAX_VALUE)
        );

        cmdCerrar.setText("Cerrar");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(PanelFiltro, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(PanelListado, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(cmdCerrar)
                        .addGap(127, 127, 127))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PanelFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(PanelListado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(cmdCerrar)
                .addContainerGap(66, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void txtDeFechaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtDeFechaActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_txtDeFechaActionPerformed

private void jTextFieldDeHoraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextFieldDeHoraActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_jTextFieldDeHoraActionPerformed

private void jCheckBoxDiaCompletoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxDiaCompletoActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_jCheckBoxDiaCompletoActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel PanelEstado;
    private javax.swing.JPanel PanelFiltro;
    private javax.swing.JPanel PanelListado;
    private javax.swing.JPanel PanelLocalizacion;
    private javax.swing.JButton cmdBuscar;
    private javax.swing.JButton cmdCerrar;
    private javax.swing.JComboBox comboCiudad;
    private javax.swing.JComboBox comboPais;
    private javax.swing.JComboBox comboProvincia;
    private javax.swing.JCheckBox jCheckBoxDiaCompleto;
    private javax.swing.JLabel jLabelAFecha;
    private javax.swing.JLabel jLabelAHora;
    private javax.swing.JLabel jLabelDeFecha;
    private javax.swing.JLabel jLabelDeHora;
    private javax.swing.JPanel jPanelDuracion;
    private javax.swing.JPanel jPanelFecha;
    private javax.swing.JTextField jTextFieldAHora;
    private javax.swing.JTextField jTextFieldDeHora;
    private javax.swing.JLabel labelCiudad;
    private javax.swing.JLabel labelPais;
    private javax.swing.JLabel labelProvincia;
    private javax.swing.JTextField txtAFecha;
    private javax.swing.JTextField txtDeFecha;
    // End of variables declaration//GEN-END:variables
}
